package cjq.dao.impl;

import cjq.bean.Student;
import cjq.dao.StudentDao;
import cjq.util.DBUtils;


import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//接口名+Impl=当前类名
public class StudentDaoImpl implements StudentDao {
    @Override
    public List<Student> getall(Class cla) {
//执行sql语句，获得结果集
        DBUtils dbUtils = new DBUtils();
        String sql = "select * from student";
        List list = new ArrayList();
        ResultSet rs = dbUtils.query(sql, list);

//通过反射自动读取数据
        List list1 = new ArrayList<Student>();
        try {
            ResultSetMetaData metaData = rs.getMetaData();//返回结果集对应的数据库中的相关信息
            int count=metaData.getColumnCount();//得到列数
            String[] columnnames=new String[count];
            for (int i = 0; i < count; i++) {
            // System.out.println(metaData.getColumnName(i+1));//列的位置从1开始
                columnnames[i]=metaData.getColumnName(i+1);
            }
            //得到实体类中的所有的方法   通过结果集的列名与实体类的对应的set方法进行匹配
            Method[] methods =cla.getDeclaredMethods();
            while(rs.next()){
                Object s=cla.newInstance();//调取无参构造创建对象
                for (String columnname : columnnames) {
                    String name="set"+columnname;//setstuid
                    for (Method method : methods) {
                        if(method.getName().equalsIgnoreCase(name)){
                            method.invoke(s,rs.getObject(columnname));//执行了对应的set方法
                            break;
                        }
                    }
                }
                list1.add(s);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } finally {
            dbUtils.closeall();
        }
        return list1;

    }
}
